home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / games / IndiZone / oort / input.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  12.7 KB  |  694 lines

  1. /*
  2.  * Copyright (C) 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*------------------------------------------------------------------------------
  18.  *
  19.  * OORT - input.c - Routines for reading user input.
  20.  *
  21.  * $Id: input.c,v 1.2 1994/01/28 00:18:50 mtj Exp $
  22.  * 
  23.  * Chris Fouts - April, 1993.
  24.  * 
  25.  *----------------------------------------------------------------------------*/
  26.  
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <unistd.h>
  30. #include <gl/gl.h>
  31. #include <gl/device.h>
  32.  
  33. #include <pf.h>
  34. #include <prmath.h>
  35.  
  36. #include "oort.h"
  37. #include "radar.h"
  38. #include "dashboard.h"
  39. #include "input.h"
  40. #include "sound.h"
  41. #include "configure.h"
  42. #include "vehicle.h"
  43.  
  44. /* BEGIN PROTOTYPES -S input.c */
  45. static void     setPickCoords( short mx, short my ) ;
  46. /* END PROTOTYPES -S input.c */
  47.  
  48.  
  49. int        debugOn = 0 ;
  50. int        freezeTape = 0 ;
  51. int        pausing = 0 ;
  52. int        markPoint = 0 ;
  53. float        startExpTime ;
  54. int        roidZoom = 0 ;
  55. int        braking ;
  56. int        orbitalActive = 1 ;
  57.  
  58. extern int    showHelp ;
  59. extern int    demoMode ;
  60. extern int    cloakOn ;
  61. extern int    stayInProgram ;
  62. extern int    showStats ;
  63. extern int    needToRepaint ;
  64. extern int    selfStatus ;
  65. extern int    newSelfStatus ;
  66. extern float    mouseX ;
  67. extern float    mouseY ;
  68. extern float    pickX ;
  69. extern float    pickY ;
  70. extern int    leftMouseHit ;
  71. extern int    middleMouseDown ;
  72. extern int    rightMouseHit ;
  73. extern int    sendingMessage ;
  74. extern float    mvOverlayH ;
  75. extern float    mvOverlayW ;
  76. extern float    gameTime ;
  77. extern Player    player[] ;
  78. extern int    selfDestruct ;
  79. extern float    selfDestructTime ;
  80. extern float    selfDestructAlarmTime ;
  81. extern float    latitude ;
  82. extern float    longitude ;
  83.  
  84. ViewPort    mainVP ;
  85.  
  86. extern ViewPort    headingVP ;
  87. extern ViewPort    dashboardVP ;
  88. extern ViewPort    radarVP ;
  89. extern ViewPort    indicatorVP ;
  90.  
  91. static float    mvMidX = 0.0f ;
  92. static float    mvMidY = 0.0f ;
  93. static float    mvScaleFactor = 1.0f ;
  94. static float    winWidth = 1.0f ;
  95. static float    winHeight = 1.0f ;
  96. static float    winOrigX = 0.0f ;
  97. static float    winOrigY = 0.0f ;
  98.  
  99. /*------------------------------------------------------------------------------
  100.  * Read user input.
  101.  *----------------------------------------------------------------------------*/
  102. void
  103. grabInput(
  104.     void
  105.     )
  106. {
  107.     int        mouseMoved = 0 ;
  108.     short        val ;
  109.     static short    mx = 0 ;
  110.     static short    my = 0 ;
  111.  
  112.     while( qtest() )
  113.     {
  114.         if( !sendingMessage )
  115.         {
  116.             switch( qread( &val ) )
  117.             {
  118.                 case MOUSEX :
  119.                     mx = val ;
  120.                     mouseMoved = 1 ;
  121.                     break ;
  122.  
  123.                 case MOUSEY :
  124.                     my = val ;
  125.                     mouseMoved = 1 ;
  126.                     break ;
  127.  
  128.                 case MIDDLEMOUSE :
  129.                     middleMouseDown = val ;
  130.                     mouseMoved = 1 ;
  131.                     break ;
  132.  
  133.                 case SPACEKEY :
  134.                     if( val )
  135.                     {
  136.                         applyBrakes() ;
  137.                     }
  138.                     break ;
  139.  
  140.                 case LEFTMOUSE :
  141.                     if( val )
  142.                     {
  143.                         leftMouseHit = 1 ;
  144.                         setPickCoords( mx, my ) ;
  145.                     }
  146.                     break ;
  147.  
  148.                 case REDRAW :
  149.                     getWindowPosition() ;
  150.                     needToRepaint = 1 ;
  151.                     break ;
  152.  
  153.                 case AKEY :
  154.                     if( val == 0 )
  155.                     {
  156.                         radarZoomOut() ;
  157.                     }
  158.                     break ;
  159.  
  160.                 case ZKEY :
  161.                     if( val == 0 )
  162.                     {
  163.                         radarZoomIn() ;
  164.                     }
  165.                     break ;
  166.  
  167.                 case QKEY :
  168.                     if( val == 1 )
  169.                     {
  170.                         changeAcceleration( -1.0f ) ;
  171.                     }
  172.                     break ;
  173.  
  174.                 case WKEY :
  175.                     if( val == 1 )
  176.                     {
  177.                         changeAcceleration( -0.5f ) ;
  178.                     }
  179.                     break ;
  180.  
  181.                 case EKEY :
  182.                     if( val == 1 )
  183.                     {
  184.                         changeAcceleration( 0.5f ) ;
  185.                     }
  186.                     break ;
  187.  
  188.                 case RKEY :
  189.                     if( val == 1 )
  190.                     {
  191.                         changeAcceleration( 1.0f ) ;
  192.                     }
  193.                     break ;
  194.  
  195.                 case BKEY :
  196.                     if( val == 0 && selfStatus ==
  197.                         OORT_ST_ON_GROUND )
  198.                     {
  199.                         selfDestruct = !selfDestruct ;
  200.                         if( selfDestruct )
  201.                         {
  202.                             postNewMessage( "Self "
  203.                             "destruct in 10 "
  204.                             "seconds." ) ;
  205.                             selfDestructTime =
  206.                                 gameTime ;
  207.                             selfDestructAlarmTime =
  208.                                 0.0f ;
  209.                         }
  210.                         else
  211.                         {
  212.                             postNewMessage( "Self "
  213.                             "destruct canceled." ) ;
  214.                         }
  215.                     }
  216.                     break ;
  217.  
  218.                 case CKEY :
  219.                     if( val == 0 )
  220.                     {
  221.                         cloakOn = !cloakOn ;
  222.                         toggleCloaking() ;
  223.                     }
  224.                     break ;
  225.  
  226.                 case IKEY :
  227.                     if( val == 0 )
  228.                     {
  229.                         showConfiguration() ;
  230.                     }
  231.                     break ;
  232.  
  233.                 case SKEY :
  234.                     if( val == 0 )
  235.                     {
  236.                         listScores() ;
  237.                     }
  238.                     break ;
  239.  
  240.                 case F2KEY :
  241.                     if( val == 1 )
  242.                     {
  243.                         toggleTexturing() ;
  244.                     }
  245.                     break ;
  246.  
  247. #if defined( DEBUG )
  248.                 case LEFTARROWKEY :
  249.                     roidZoom = 2 * val ;
  250.                     break ;
  251.  
  252.                 case RIGHTARROWKEY :
  253.                     roidZoom = val ;
  254.                     break ;
  255.  
  256.                 case VKEY :
  257.                     if( val == 0 )
  258.                     {
  259.                         markPoint = !markPoint ;
  260.                     }
  261.                     break ;
  262.  
  263.                 case YKEY :
  264.                     if( val == 0 )
  265.                     {
  266.                         shieldDamage( 0.5f, 0 ) ;
  267.                     }
  268.                     break ;
  269.  
  270.                 case DKEY :
  271.                     if( val == 0 )
  272.                     {
  273.                         debugOn = !debugOn ;
  274.                         postNewMessage( "Debug %s.",
  275.                             debugOn ? "on" :
  276.                             "off" ) ;
  277.                     }
  278.                     break ;
  279.  
  280.                 case OKEY :
  281.                     if( val == 0 )
  282.                     {
  283.                         orbitalActive = !orbitalActive ;
  284.                         postNewMessage( "Orbitals %s.",
  285.                             orbitalActive ? "on" :
  286.                             "off" ) ;
  287.                     }
  288.                     break ;
  289.  
  290.                 case KKEY :
  291.                     if( val == 0 )
  292.                     {
  293.                         blowUpSelf( 0 ) ;
  294.                     }
  295.                     break ;
  296. #endif /* defined( DEBUG ) */
  297.  
  298.                 case F1KEY :
  299.                     if( val == 0 )
  300.                     {
  301.                         showStats = !showStats ;
  302.                     }
  303.                     break ;
  304.  
  305.                 case FKEY :
  306.                     if( val == 0 )
  307.                     {
  308.                         freezeTape = !freezeTape ;
  309.                         postNewMessage( "Freeze %s.",
  310.                             freezeTape ? "on" :
  311.                             "off" ) ;
  312.                     }
  313.                     break ;
  314.  
  315.                 case PKEY :
  316.                     if( val == 0 )
  317.                     {
  318.                         pausing = !pausing ;
  319.                         postNewMessage( "Pause %s.",
  320.                             pausing ? "on" :
  321.                             "off" ) ;
  322.                     }
  323.                     break ;
  324.  
  325.                 case MKEY :
  326.                     if( val == 0 )
  327.                     {
  328.                         initMessage( MAIL_ALL ) ;
  329.                     }
  330.                     break ;
  331.  
  332.                 case TKEY :
  333.                     if( val == 0 )
  334.                     {
  335.                         initMessage(
  336.                             player[SELF].team ) ;
  337.                     }
  338.                     break ;
  339.  
  340.                 case UPARROWKEY :
  341.                     if( val == 0 )
  342.                     {
  343.                         postNewMessage( "Volume set to "
  344.                             "%d.",
  345.                             volumeChange( 1 ) ) ;
  346.                         sfx( SFX_OK ) ;
  347.                     }
  348.                     break ;
  349.  
  350.                 case DOWNARROWKEY :
  351.                     if( val == 0 )
  352.                     {
  353.                         postNewMessage( "Volume set to "
  354.                             "%d.",
  355.                             volumeChange( -1 ) ) ;
  356.                         sfx( SFX_OK ) ;
  357.                     }
  358.                     break ;
  359.  
  360.                 case RIGHTMOUSE :
  361.                     if( val )
  362.                     {
  363.                         rightMouseHit = 1 ;
  364.                         setPickCoords( mx, my ) ;
  365.                     }
  366.                     break ;
  367.  
  368.                 case LKEY :
  369.                     if( val == 0 )
  370.                     {
  371.                         postNewMessage( "Lat:%.1f "
  372.                             "Lng:%.1f", latitude,
  373.                             longitude ) ;
  374.                     }
  375.                     break ;
  376.  
  377.                 case HKEY :
  378.                     if( val == 0 )
  379.                     {
  380.                         showHelp = !showHelp ;
  381.                     }
  382.                     break ;
  383.  
  384.                 case ESCKEY :
  385.                     if( val == 0 )
  386.                     {
  387.                         stayInProgram = 0 ;
  388.                         newSelfStatus = selfStatus =
  389.                                 OORT_ST_EXIT ;
  390.                     }
  391.                     break ;
  392.             }
  393.         }
  394.         else
  395.         {
  396.             switch( qread( &val ) )
  397.             {
  398.                 case MOUSEX :
  399.                     mx = val ;
  400.                     mouseMoved = 1 ;
  401.                     break ;
  402.  
  403.                 case MOUSEY :
  404.                     my = val ;
  405.                     mouseMoved = 1 ;
  406.                     break ;
  407.  
  408.                 case MIDDLEMOUSE :
  409.                     braking = val ;
  410.                     mouseMoved = 1 ;
  411.                     break ;
  412.  
  413.                 case LEFTMOUSE :
  414.                     if( val )
  415.                     {
  416.                         leftMouseHit = 1 ;
  417.                         setPickCoords( mx, my ) ;
  418.                     }
  419.                     break ;
  420.  
  421.                 case REDRAW :
  422.                     getWindowPosition() ;
  423.                     needToRepaint = 1 ;
  424.                     break ;
  425.  
  426.                 case KEYBD :
  427.                     addToMessage( (char)val ) ;
  428.                     break ;
  429.  
  430.                 case UPARROWKEY :
  431.                     if( val == 0 )
  432.                     {
  433.                         postNewMessage( "Volume set to "
  434.                             "%d.",
  435.                             volumeChange( 1 ) ) ;
  436.                         sfx( SFX_OK ) ;
  437.                     }
  438.                     break ;
  439.  
  440.                 case DOWNARROWKEY :
  441.                     if( val == 0 )
  442.                     {
  443.                         postNewMessage( "Volume set to "
  444.                             "%d.",
  445.                             volumeChange( -1 ) ) ;
  446.                         sfx( SFX_OK ) ;
  447.                     }
  448.                     break ;
  449.  
  450.                 case RIGHTMOUSE :
  451.                     if( val )
  452.                     {
  453.                         rightMouseHit = 1 ;
  454.                         setPickCoords( mx, my ) ;
  455.                     }
  456.                     break ;
  457.  
  458.                 case ESCKEY :
  459.                     if( val == 0 )
  460.                     {
  461.                         stayInProgram = 0 ;
  462.                         newSelfStatus = selfStatus =
  463.                                 OORT_ST_EXIT ;
  464.                     }
  465.                     break ;
  466.  
  467.             }
  468.         }
  469.     }
  470.  
  471.     if( mouseMoved && !pausing )
  472.     {
  473.         mouseX = 2.0f * ( (float)mx - mvMidX ) / mvScaleFactor ;
  474.         if( mouseX > 1.0f )
  475.         {
  476.             mouseX = 1.0f ;
  477.         }
  478.         else if( mouseX < -1.0f )
  479.         {
  480.             mouseX = -1.0f ;
  481.         }
  482.  
  483.         mouseY = 2.0f * ( (float)my - mvMidY ) / mvScaleFactor ;
  484.         if( mouseY > 1.0f )
  485.         {
  486.             mouseY = 1.0f ;
  487.         }
  488.         else if( mouseY < -1.0f )
  489.         {
  490.             mouseY = -1.0f ;
  491.         }
  492.     }
  493. }
  494.  
  495.  
  496.  
  497. /*------------------------------------------------------------------------------
  498.  * Determine the center of the window
  499.  *----------------------------------------------------------------------------*/
  500. void
  501. getWindowPosition(
  502.     void
  503.     )
  504. {
  505.     long        ox ;
  506.     long        oy ;
  507.     long        sizeX ;
  508.     long        sizeY ;
  509.     float        fovx ;
  510.     float        cx ;
  511.     float        cy ;
  512.     float        sx ;
  513.     float        sy ;
  514.     pfVec4        pt ;
  515.     pfMatrix    m ;
  516.  
  517.     getorigin( &ox, &oy ) ;
  518.     getsize( &sizeX, &sizeY ) ;
  519.  
  520.     winWidth = (float)sizeX ;
  521.     winHeight = (float)sizeY ;
  522.  
  523.     winOrigX = (float)ox ;
  524.     winOrigY = (float)oy ;
  525.  
  526.     mvMidX = 0.5 * winWidth + (float)ox ;
  527.     mvMidY = 0.5 * winHeight * ( 1.0f + MAIN_VIEW_BOTTOM ) + (float)oy ;
  528.  
  529.     if( winWidth < ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight )
  530.     {
  531.         mvScaleFactor = winWidth ;
  532.         mvOverlayW = 1.0f ;
  533.         mvOverlayH = ( 1.0f - MAIN_VIEW_BOTTOM )*winHeight / winWidth ;
  534.     }
  535.     else
  536.     {
  537.         mvScaleFactor = ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight ;
  538.         mvOverlayW = winWidth /
  539.             ( ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight ) ;
  540.         mvOverlayH = 1.0f ;
  541.     }
  542.  
  543.     /*
  544.      * Determine location of main window.
  545.      */
  546.     mainVP.left = 0 ;
  547.     mainVP.right = winWidth - 1 ;
  548.     mainVP.top = winHeight - 1 ;
  549.     mainVP.bottom = MAIN_VIEW_BOTTOM * winHeight ;
  550.  
  551.     /*
  552.      * Determine location of dashboard.
  553.      */
  554.     setDashboardPosition( 0, winWidth - 1,
  555.                 0, (int)( MAIN_VIEW_BOTTOM * winHeight - 1 ) ) ;
  556.  
  557.     /*
  558.      * Determine location of compass.
  559.      */
  560.     headingVP.left = 0 ;
  561.     headingVP.right = 100 ;
  562.     headingVP.top = MAIN_VIEW_BOTTOM * winHeight - 1 ;
  563.     headingVP.bottom = headingVP.top - 100 ;
  564.  
  565.     /*
  566.      * Determine position of roll/pitch indicator.
  567.      */
  568.     m[0][0] = 2.0f / ( mvOverlayW + mvOverlayW ) ;
  569.     m[0][1] = 0.0f ;
  570.     m[0][2] = 0.0f ;
  571.     m[0][3] = 0.0f ;
  572.  
  573.     m[1][0] = 0.0f ;
  574.     m[1][1] = 2.0f / ( mvOverlayH + mvOverlayH ) ;
  575.     m[1][2] = 0.0f ;
  576.     m[1][3] = 0.0f ;
  577.  
  578.     m[2][0] = 0.0f ;
  579.     m[2][1] = 0.0f ;
  580.     m[2][2] = -1.0f ;
  581.     m[2][3] = 0.0f ;
  582.  
  583.     m[3][0] = 0.0f ;
  584.     m[3][1] = 0.0f ;
  585.     m[3][2] = 0.0f ;
  586.     m[3][3] = 1.0f ;
  587.  
  588.     /*
  589.      * Transform opposite corners of where indicator region is
  590.      * s'posed to be.
  591.      */
  592.     sx = 0.5 * ( mainVP.right - mainVP.left + 1.0 ) ;
  593.     sy = 0.5 * ( mainVP.top - mainVP.bottom + 1.0 ) ;
  594.     cx = 0.5 * ( mainVP.right + mainVP.left ) ;
  595.     cy = 0.5 * ( mainVP.top + mainVP.bottom ) ;
  596.  
  597.     pt[0] = -0.2f ;
  598.     pt[1] = -0.2f ;
  599.     pt[2] = 0.0f ;
  600.     pt[3] = 1.0f ;
  601.     pfXformVec4( pt, pt, m ) ;
  602.  
  603.     pt[0] /= pt[3] ;
  604.     pt[1] /= pt[3] ;
  605.  
  606.     indicatorVP.left = (int)( pt[0] * sx + cx + 0.5 ) ;
  607.     indicatorVP.bottom = (int)( pt[1] * sy + cy + 0.5 ) ;
  608.  
  609.     pt[0] = 0.2f ;
  610.     pt[1] = 0.2f ;
  611.     pt[2] = 0.0f ;
  612.     pt[3] = 1.0f ;
  613.     pfXformVec4( pt, pt, m ) ;
  614.  
  615.     pt[0] /= pt[3] ;
  616.     pt[1] /= pt[3] ;
  617.  
  618.     indicatorVP.right = (int)( pt[0] * sx + cx + 0.5 ) ;
  619.     indicatorVP.top = (int)( pt[1] * sy + cy + 0.5 ) ;
  620. }
  621.  
  622.  
  623.  
  624. /*------------------------------------------------------------------------------
  625.  * Specify which devices we're interested in.
  626.  *----------------------------------------------------------------------------*/
  627. void
  628. setDevices(
  629.     void
  630.     )
  631. {
  632.     qdevice( ESCKEY ) ;
  633.     qdevice( MOUSEX ) ;
  634.     qdevice( MOUSEY ) ;
  635.     qdevice( RIGHTMOUSE ) ;
  636.     qdevice( AKEY ) ;
  637.     qdevice( ZKEY ) ;
  638.     qdevice( UPARROWKEY ) ;
  639.     qdevice( DOWNARROWKEY ) ;
  640.     qdevice( F1KEY ) ;
  641.     qdevice( F2KEY ) ;
  642.     qdevice( REDRAW ) ;
  643.     qdevice( SKEY ) ;
  644.     if( !demoMode )
  645.     {
  646.         qdevice( KEYBD ) ;
  647.         qdevice( MIDDLEMOUSE ) ;
  648.         qdevice( LEFTMOUSE ) ;
  649.         qdevice( BKEY ) ;
  650.         qdevice( CKEY ) ;
  651.         qdevice( FKEY ) ;
  652.         qdevice( HKEY ) ;
  653.         qdevice( LKEY ) ;
  654.         qdevice( IKEY ) ;
  655.         qdevice( MKEY ) ;
  656.         qdevice( PKEY ) ;
  657.         qdevice( TKEY ) ;
  658.         qdevice( QKEY ) ;
  659.         qdevice( WKEY ) ;
  660.         qdevice( EKEY ) ;
  661.         qdevice( RKEY ) ;
  662.         qdevice( SPACEKEY ) ;
  663. #if defined( DEBUG )
  664.         qdevice( RIGHTARROWKEY ) ;
  665.         qdevice( LEFTARROWKEY ) ;
  666.         qdevice( DKEY ) ;
  667.         qdevice( KKEY ) ;
  668.         qdevice( OKEY ) ;
  669.         qdevice( VKEY ) ;
  670.         qdevice( YKEY ) ;
  671. #endif /* defined( DEBUG ) */
  672.     }
  673. }
  674.  
  675.  
  676.  
  677. /*------------------------------------------------------------------------------
  678.  * Calculate the normalized pick coordinates relative to the main viewport.
  679.  *----------------------------------------------------------------------------*/
  680. static void
  681. setPickCoords(
  682.     short    mx,
  683.     short    my
  684.     )
  685. {
  686.     pickX = ( (float)mx - winOrigX - mainVP.left ) /
  687.         (float)( mainVP.right - mainVP.left ) ;
  688.     pickY = ( (float)my - winOrigY - mainVP.bottom ) /
  689.         (float)( mainVP.top - mainVP.bottom ) ;
  690. }
  691.  
  692.  
  693.  
  694.